package com.ccn.ui.a1ui;

import android.view.MotionEvent;

/**
 * 事件分发机制
 * 事件的类型；
 * 1.MotionEvent.ACTION_DOWN 手指刚接触屏幕
 *
 * 2.MotionEvent.ACTION_UP 手指从屏幕上松开
 *
 * 3.MotionEvent.ACTION_MOVE 手指在屏幕上滑动
 *
 * 4.MotionEvent.ACTION_CANCEL 非人为因素取消
 *
 * 事件序列：
 * 1.点击屏幕立即松开，事件序列：DOWN->UP
 * 2.点击屏幕滑动再松开，事件序列：DOWN->MOVE...->MOVE->UP
 * 见shijianxulie.png
 *
 * 事件分发对象
 * Activity
 * ViewGroup
 * View
 *
 * 事件分发主要方法
 * dispatchTouchEvent(MotionEvent)用来进行事件分发
 * onInterceptTouchEvent(MotionEvent)判断是否拦截事件(只存在于ViewGroup中)
 * onTouchEvent(MotionEvent)处理点击事件
 *
 * 事件分发结论：
 * 一个时间序列：从手指接触屏幕到手指离开屏幕，在这个过程中产生的一系列事件，以DOWN事件开始，
 * 中间包含不定数的MOVE时间，以UP事件结束
 *
 * 正常情况下，一个时间序列只能被一个View拦截并消耗
 *
 * 某个View（指的是ViewGroup）一旦决定拦截，那么这个时间序列都将有它的onTouchEvent处理，并且
 * 它的onInterceptTouchEvent不会再调用
 *
 * 某个View一单开始处理事件，如果它不消耗ACTION_DOWN事件 (onTouchEvent返回false)，
 * 那么同一事件序列中其他事件都不会再交给它处理。
 * 并且重新交给它的父元素处理（父元素onTouchEvent被调用）。
 *
 * 事件传递过程 由外向内，即事件总是先传递给父元素，然后再由父元素分发给子View，
 * 通过requestDisallowInterceptTouchEvent方法可以在子View中干预父元素的事件分发过程，
 * ACTION_DOWN除外。
 *
 * ViewGroup默认不拦截任何时间，即onInterceptTouchEvent默认返回false。
 * View没有onInterceptTouchEvent方法，一旦有点击事件传递给它，那么它的onTouchEvent方法会被调用。
 *
 * View的onTouchEvent默认会消耗事件（返回true），除非它是不可点击的（clickable和longClickable同时为false）。
 * View的longClickable默认都为false，clickable要分情况，Button的clickable默认为true，TextView的clickable默认为false。
 *
 * View的enable属性不影响onTouchEvent的默认返回值。哪怕一个View是disable状态，只要它的clickable或者longClickable有一个为true，
 * 那么它的onTouchEvent就会返回true。
 *
 * onClick会相应的前提是当前View是可点击的，并且收到了ACTION_DOWN和ACTION_UP的时间，并且受长按时间影响，
 * 当长按事件返回true时，onClick不会响应。
 *
 * onLongClick在ACTION_DOWN里判断是否进行响应，要想执行长按事件，
 * 该View必须是longClickable的，并且设置了OnLongClickListener。
 */
public class A1_3_1TouchEvent {

}
